/*
Metodo dos minimos quadrados
 *
 */

package br.leiam.eolica.funcoes;

/**
 *
 * @author Denis
 */

public class MinimosQuadrados {
private double[] frequenciaRelativa;
private double[] velocidadeVentoMedio;
public double[] Fv;
public  double a = 0;
public  double b = 0;
public  double k = 0;
public  double c = 0;
public double counter=0;
public double n=0;
public void calculaConstantes(double[] frequenciaRelativa,double[] velocidadeVentoMedio,double passo){
double pc=0;
    this.frequenciaRelativa=frequenciaRelativa;
    this.velocidadeVentoMedio=velocidadeVentoMedio;

        n = frequenciaRelativa.length;
        Fv = new double[(int)n];
        double Sxy =0;
        double Sx = 0;
        double Sy = 0;
        double Sx2 = 0;
        double y = 0;
        double x = 0;
       counter = 0;
       
        for(int i=0;i<n;i++){
        Fv[i]=0;
   
         //Fv[i] = frequenciaRelativa[i];//*((velocidadeVentoMedio[i+1]-velocidadeVentoMedio[i])/(velocidadeVentoMedio[(int)n-1])));
        
        
if(pc+frequenciaRelativa[i]<1)
         if(frequenciaRelativa[i]>0.000000000001){
        pc=pc+(frequenciaRelativa[i]);//*(velocidadeVentoMedio[2]-velocidadeVentoMedio[1]);
           Fv[i]=pc;
             counter++;
               y = Math.log(Math.log(1/(1-(Fv[i]))));
            x = Math.log(velocidadeVentoMedio[i]);
            Sxy = Sxy + x*y;
            Sx = Sx + x;
            Sy = Sy + y;
            Sx2 = Sx2 + x*x;
//System.out.printf("\n x=%.2f  y=%f  Fv=%f   pc=%f", x,y,Fv[i],pc);
         }
        }
      //n=counter;
      double n1 = counter-1;
        a = ((n1*Sxy)-Sx*Sy)/(((n1*Sx2)-Sx*Sx));
        b = ((Sx2*Sy-Sxy*Sx)/((n1*Sx2)-Sx*Sx));

        k = Math.abs(a);
        c = Math.exp(Math.abs(b/a));
        //c=1.45;
        //k=3.5;
// System.out.printf("\n b = %.2f   a = %.2f   k = %.2f   c = %.2f     n = %.2f    counter = %.2f",b,a,k,c,n,counter);
n = counter-1;
}
    /**
     * @return the frequenciaRelativa
     */
    public double[] getFrequenciaRelativa() {
        return frequenciaRelativa;
    }

    /**
     * @return the velocidadeVento
     */
    public double[] getVelocidadeVentoMedio() {
        return velocidadeVentoMedio;
    }

    
}
